home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / sml_nj / 93src.lha / src / lex / tokentable.sml < prev   
Encoding:
Text File  |  1993-01-27  |  4.0 KB  |  98 lines

  1. (***************************************************************************
  2.  
  3.   TOKEN.SML: hash table for token recognition
  4.  
  5.  ***************************************************************************)
  6.  
  7. functor TokenTable(Tokens:ML_TOKENS):
  8.   sig val checkToken: (string * int) -> (Tokens.svalue,int)Tokens.token
  9.       val checkTyvar: (string * int) -> (Tokens.svalue,int)Tokens.token
  10.   end = 
  11. struct
  12.  
  13. exception NotToken
  14.  
  15. (* The list of string with their corresponding token *)
  16.  
  17. val tokenList =
  18.   [("*"        , fn yypos => Tokens.ASTERISK(yypos,yypos+1)),
  19.    ("|"        , fn yypos => Tokens.BAR(yypos,yypos+1)),
  20.    (":"        , fn yypos => Tokens.COLON(yypos,yypos+1)),
  21.    ("="        , fn yypos => Tokens.EQUAL(yypos,yypos+1)),
  22.    ("#"        , fn yypos => Tokens.HASH(yypos,yypos+1)),
  23.    ("and"    , fn yypos => Tokens.AND(yypos,yypos+3)),
  24.    ("abstraction"    , fn yypos => Tokens.ABSTRACTION(yypos,yypos+11)),
  25.    ("abstype"    , fn yypos => Tokens.ABSTYPE(yypos,yypos+7)),
  26.    ("->"    , fn yypos => Tokens.ARROW(yypos,yypos+2)),
  27.    ("as"    , fn yypos => Tokens.AS(yypos,yypos+2)),
  28.    ("case"    , fn yypos => Tokens.CASE(yypos,yypos+4)),
  29.    ("datatype"    , fn yypos => Tokens.DATATYPE(yypos,yypos+8)),
  30.    ("else"    , fn yypos => Tokens.ELSE(yypos,yypos+4)),
  31.    ("end"    , fn yypos => Tokens.END(yypos,yypos+3)),
  32.    ("eqtype"    , fn yypos => Tokens.EQTYPE(yypos,yypos+6)),
  33.    ("exception"    , fn yypos => Tokens.EXCEPTION(yypos,yypos+9)),
  34.    ("do"    , fn yypos => Tokens.DO(yypos,yypos+2)),
  35.    ("=>"    , fn yypos => Tokens.DARROW(yypos,yypos+2)),
  36.    ("fn"    , fn yypos => Tokens.FN(yypos,yypos+2)),
  37.    ("fun"    , fn yypos => Tokens.FUN(yypos,yypos+3)),
  38.    ("functor"    , fn yypos => Tokens.FUNCTOR(yypos,yypos+7)),
  39.    ("funsig"    , fn yypos => Tokens.FUNSIG(yypos,yypos+7)),
  40.    ("handle"    , fn yypos => Tokens.HANDLE(yypos,yypos+6)),
  41.    ("if"    , fn yypos => Tokens.IF(yypos,yypos+2)),
  42.    ("in"    , fn yypos => Tokens.IN(yypos,yypos+2)),
  43.    ("include"    , fn yypos => Tokens.INCLUDE(yypos,yypos+7)),
  44.    ("infix"    , fn yypos => Tokens.INFIX(yypos,yypos+5)),
  45.    ("infixr"    , fn yypos => Tokens.INFIXR(yypos,yypos+6)),
  46.    ("let"    , fn yypos => Tokens.LET(yypos,yypos+3)),
  47.    ("local"    , fn yypos => Tokens.LOCAL(yypos,yypos+5)),
  48.    ("nonfix"    , fn yypos => Tokens.NONFIX(yypos,yypos+6)),
  49.    ("of"    , fn yypos => Tokens.OF(yypos,yypos+2)),
  50.    ("op"    , fn yypos => Tokens.OP(yypos,yypos+2)),
  51.    ("open"    , fn yypos => Tokens.OPEN(yypos,yypos+4)),
  52.    ("overload"    , fn yypos => Tokens.OVERLOAD(yypos,yypos+8)),
  53.    ("raise"    , fn yypos => Tokens.RAISE(yypos,yypos+5)),
  54.    ("rec"    , fn yypos => Tokens.REC(yypos,yypos+3)),
  55.    ("sharing"    , fn yypos => Tokens.SHARING(yypos,yypos+7)),
  56.    ("sig"    , fn yypos => Tokens.SIG(yypos,yypos+3)),
  57.    ("signature"    , fn yypos => Tokens.SIGNATURE(yypos,yypos+9)),
  58.    ("struct"    , fn yypos => Tokens.STRUCT(yypos,yypos+6)),
  59.    ("structure"    , fn yypos => Tokens.STRUCTURE(yypos,yypos+9)),
  60.    ("then"    , fn yypos => Tokens.THEN(yypos,yypos+4)),
  61.    ("type"    , fn yypos => Tokens.TYPE(yypos,yypos+4)),
  62.    ("val"    , fn yypos => Tokens.VAL(yypos,yypos+3)),
  63.    ("while"    , fn yypos => Tokens.WHILE(yypos,yypos+5)),
  64.    ("with"    , fn yypos => Tokens.WITH(yypos,yypos+4)),
  65.    ("withtype"    , fn yypos => Tokens.WITHTYPE(yypos,yypos+8)),
  66.    ("orelse"    , fn yypos => Tokens.ORELSE(yypos,yypos+6)),
  67.    ("andalso"    , fn yypos => Tokens.ANDALSO(yypos,yypos+7))]
  68.  
  69. (* hash table obtained from the previous list *)
  70. val tokenTable =
  71.   let val t: (int -> (Tokens.svalue,int)Tokens.token) IntStrMap.intstrmap =
  72.     IntStrMap.new(128,NotToken)
  73.   in           
  74.   app (fn (str,tok) => 
  75.      IntStrMap.add t (StrgHash.hashString str,str,tok)) 
  76.       tokenList;
  77.   t
  78.   end
  79.  
  80. (* look-up function. If the symbol is found, the corresponding token is
  81.    generated with the position of its begining. Otherwise it is a regular
  82.    identifier. *)
  83.    
  84. fun checkToken (str,yypos) =
  85.   let val hash = StrgHash.hashString str
  86.   in
  87.   IntStrMap.map tokenTable (hash,str) yypos
  88.   handle NotToken => 
  89.     Tokens.ID(FastSymbol.rawSymbol(hash,str),yypos,yypos+size (str))
  90.   end
  91. ;
  92.  
  93. fun checkTyvar (str,yypos) =
  94.   let val hash = StrgHash.hashString str
  95.   in Tokens.TYVAR (FastSymbol.rawSymbol(hash,str),yypos,yypos+size (str)) end
  96.  
  97. end
  98.